package com.sxkf.template.job;

import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.sxkf.template.entity.Order;
import com.sxkf.template.service.OrderService;
import org.jeecg.common.util.CheckEmptyUtil;
import com.sxkf.template.constants.OrderConstant;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;


/**
 * @author yyl25
 */
@Configuration
@Transactional
public class OrderJob {

    //  corn表达式范例
//	每隔5秒执行一次：*/5 * * * * ?
//	每隔1分钟执行一次：0 */1 * * * ?
//	每天23点执行一次：0 0 23 * * ?
//	每天凌晨1点执行一次：0 0 1 * * ?
//	每月1号凌晨1点执行一次：0 0 1 1 * ?
//	每月最后一天23点执行一次：0 0 23 L * ?
//	每周星期一凌晨1点实行一次：0 0 1 ? * MON
//	在26分、29分、33分执行一次：0 26,29,33 * * * ?
//	每天的0点、13点、18点、21点都执行一次：0 0 0,13,18,21 * * ?
    @Resource
    private OrderService orderService;


    /**
     * 1分钟执行一次
     * 将支付状态为no转化为取消状态
     * 退还用户优惠券
     */
    @Scheduled(cron = "0 0/1 * * * ?")
    public void updateOrderNoToPay() {
        //所有状态为no的订单
        List<Order> orders = orderService.list(new LambdaQueryWrapper<Order>()
                .select(Order::getId)
                .eq(Order::getState, OrderConstant.NO)
                .le(Order::getCreateTime, DateUtil.offsetMinute(new Date(), -15)));
        if (CheckEmptyUtil.isEmpty(orders)) {
            return ;
        }
        List<String> orderIds  = orders.stream().map(Order::getId).collect(Collectors.toList());
        orderIds.forEach(orderService::cancel);
    }
}
